package cn.biplam.back.operator.ddl.md2sql;

import java.util.ArrayList;

import cn.biplam.back.operator.ddl.md2sql.md.Md;
import cn.biplam.back.operator.ddl.md2sql.md.MdFactory;
import cn.biplam.common.client.DbResource;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

public class DbInfo {

	private Md mMd;

	/**列 列名*/

	public static final String COLUMN_NAME = "column_name";
	/**列 数据类型，来自 java.sql.Types 的 SQL 类型*/
	public static final String COLUMN_DATA_TYPE = "DATA_TYPE";
	/**列 大小*/
	public static final String COLUMN_SIZE = "data_precision";
	/**列 小数部分的位数。对于 DECIMAL_DIGITS 不适用的数据类型，则返回 Null*/
	public static final String COLUMN_DECIMAL_DIGITS = "data_scale";
	/**列 基数（通常为 10 或 2）*/
	public static final String COLUMN_NUM_PREC_RADIX = "NUM_PREC_RADIX";
	/**列 是否允许使用 NULL*/
	public static final String COLUMN_NULLABLE = "nullable";
	/**列 描述列的注释（可为 null*/
	public static final String COLUMN_COMMENTS = "col_comments";
	/**列 该列的默认值，当值在单引号内时应被解释为一个字符串*/
	public static final String COLUMN_DEF = "col_default";
	/**列 ISO 规则用于确定列是否包括 null*/
	public static final String IS_NULLABLE = "IS_NULLABLE";
	/**表描述*/
	public static final String TABLE_COMMENTS = "table_comments";
	/**表*/
	public static final String TABLE_OID = "oid";
	/**表 用户*/
	public static final String TABLE_SCHEM = "schema";
	/**表 名*/
	public static final String TABLE_NAME = "table_name";
	/**主键 名*/
	public static final String PK_NAME = "pk_name";
	/**主键 列名*/
	public static final String PK_COLUMN_NAME = "pk_column_name";
	/**主键 列顺序*/
	public static final String PK_KEY_SEQ = "KEY_SEQ";
	/**外键 被导入的主键表名称*/
	public static final String FK_PKTABLE_NAME = "fk_pk_table_name";
	/**外键 被导入的主键列名称*/
	public static final String FK_PKCOLUMN_NAME = "fk_pk_column_name";
	/**外键 外键表名称*/
	public static final String FK_FKTABLE_NAME = "FKTABLE_NAME";
	/**外键 外键列名称*/
	public static final String FK_FKCOLUMN_NAME = "fk_column_name";
	/**外键 外键中的序列号（值 1 表示外键中的第一列，值 2 表示外键中的第二列*/
	public static final String FK_KEY_SEQ = "KEY_SEQ";
	/**外键 外键的名称（可为 null）*/
	public static final String FK_FK_NAME = "fk_name";
	/**外键 主键的名称（可为 null）*/
	public static final String FK_PK_NAME = "PK_NAME";
	/**索引 索引名称*/
	public static final String INDEX_INDEX_NAME  = "index_name";
	/**索引 索引类型*/
	public static final String INDEX_TYPE  = "TYPE";
	/**索引 索引中的列序列号*/
	public static final String INDEX_ORDINAL_POSITION  = "ORDINAL_POSITION";
	/**索引 列名称*/
	public static final String INDEX_COLUMN_NAME  = "index_column_name";
	/**索引 列排序序列*/
	public static final String INDEX_ASC_OR_DESC  = "ASC_OR_DESC";	
	/**索引 是否唯一索引，0是，1否*/
	public static final String INDEX_NON_UNIQUE  = "NON_UNIQUE";

	/**
	 * 初始化实例,此实例取表信息时数据库用户不作为限定条件，
	 *       取表主键等信息时，用默认的md数据源的数据库用户
	 * @param iOid 表名，取表信息时null标识取所有表信息，取主键等信息时不能为null
	 * @param srcDbResource 元数据源信息
	 * @throws ErrorMessage 
	 */
	public DbInfo(int iOid,DbResource srcDbResource) throws ErrorMessage{
		mMd = MdFactory.getInstance(iOid, srcDbResource);	
	}

	/**
	 * 功能   取表信息
	 * @param sSchema     源数据库用户
	 * @param sTableName  tableName  null为取全部表
	 * @param srcDbResource  源数据源,用于查找不同源数据源下的表
	 * @param mdDbResource   md数据源
	 * @return ArrayList<KvMap<String,String>>
	 * @throws ErrorMessage
	 */
	public static ArrayList<KvMap<String,String>> getTableInfo(String sSchema,
			           String sTableName,DbResource srcDbResource,DbResource mdDbResource) throws ErrorMessage {
		Md mMd = MdFactory.getInstance(-1, srcDbResource);
		return mMd.getTable(sSchema, sTableName, srcDbResource,mdDbResource);
	}

	/**
	 * 取表列信息
	 * @return ArrayList<KvMap<String, String>>
	 */
	public ArrayList<KvMap<String, String>> getColumns() {
		return mMd.getColumns();
	}


	/** 
	 * 功能    取主键信息
	 * @return  ArrayList<KvMap<String, String>>
	 */
	public ArrayList<KvMap<String, String>> getPK() {
		return mMd.getPK();
	}

	/** 
	 * 功能    取外键信息
	 * @return  ArrayList<KvMap<String, String>>
	 */
	public ArrayList<KvMap<String, String>> getFK() {
		return mMd.getFK();
	}

	/** 
	 * 功能    取索引信息
	 * @return  ArrayList<KvMap<String, String>>
	 */
	public ArrayList<KvMap<String, String>> getIndexs() {
		return mMd.getIndexs();
	}
}
